package com.fanghuaiming.mtat.sku.common;

import javax.annotation.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.stereotype.Component;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.interceptor.DefaultTransactionAttribute;

/****
 * @description: 自定义事务管理器
 * @version:1.0.0
 * @author fanghuaiming
 * @data Created in 2020/12/4 下午7:28
 *
 */
@Component
public class CustomizeTransactionManager {

    /**
     * 事务状态
     */
    private TransactionStatus transactionalStatus;

    /**
     * 事务管理器,自己定义一个manager好处是在实际业务中不是所有的数据源都需要进行手动操作事务
     * 如果想将这个事务重新交由spring管理的话直接在方法上加:
     *              @Transactional(transactionManager = "mtatSkuTransactionManager") 就可以
     */
    @Resource(name = "mtatSkuTransactionManager")
    private DataSourceTransactionManager dataSourceTransactionManager;

    /**
     * @Description: 手动开始事务
     *
     * @param:
     * @return:
     * @auther: fanghuaiming
     * @date: 2020/12/4 下午7:37
     * @version:1.0.0
     */
    public TransactionStatus begin(){
        //DefaultTransactionAttribute:Spring的通用事务属性实现。默认情况下，在运行时回滚但未检查异常。
        //获取事务状态
        transactionalStatus = dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
        return transactionalStatus;
    }

    /**
     * @Description: 手动进行提交事务
     *
     * @param:
     * @return:
     * @auther: fanghuaiming
     * @date: 2020/12/4 下午7:41
     * @version:1.0.0
     */
    public void commit(TransactionStatus transactionalStatus){
        dataSourceTransactionManager.commit(transactionalStatus);
    }

    /**
     * @Description: 手动进行回滚
     *
     * @param:
     * @return:
     * @auther: fanghuaiming
     * @date: 2020/12/4 下午7:42
     * @version:1.0.0
     */
    public void rollBack(){
        dataSourceTransactionManager.rollback(transactionalStatus);
    }
}
